package com.linchong.xshop.util;

import com.linchong.xshop.dto.ImageHolder;
import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Positions;
import org.slf4j.Logger;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import javax.imageio.ImageIO;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;

/**
 * @author linchong
 * @desc 图片工具类，压缩，放大缩小，水印等
 * @email littlexbear@163.com
 * @create 2018-07-14 15:06
 * @CopyRight(C) https://blog.csdn.net/littlexbear
 **/
public class ImageUtil {

    private static String basePath = Thread.currentThread().getContextClassLoader().getResource("").getPath();
    private static final SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
    //随机数对象
    private static final Random r = new Random();

    //获得商店小图
    //处理用户传来的文件流
    //使用spring自带的文件处理对象
    public static String generateThumbnail(ImageHolder thumbnail, String targetAddr) {
        //使用系统提供的名字，实现文件的随机名
        String realFileName = getRandomFileName();
        String extension = getFileExtension(thumbnail.getImageName());//获得文件的后缀名,即扩展名
        //两者结合存储在tarAddr路径中
        makeDirPath(targetAddr); //创建路径
        String relativeAddr = targetAddr + realFileName + extension; //相对路径
        System.out.println("相对路径是："+relativeAddr);
        File dest = new File(PathUtil.getImgBasePath() + relativeAddr);//新生成的文件的路径
        System.out.println("当前路径是："+dest);
        System.out.println("根路径是："+basePath);
        try {
            Thumbnails.of(thumbnail.getImage()).size(200, 200)
                    .watermark(Positions.BOTTOM_RIGHT, ImageIO.read(new File(basePath + "/linchongs.jpg")), 0.25f)
                    .outputQuality(0.8f).toFile(dest);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return relativeAddr;
    }

    public static String generateNormalImg(ImageHolder thumbnail, String targetAddr) {
        //获得不重复的随机名
        String realFileName = FileUtil.getRandomFileName();
        //获取文件扩展名如.png,.jpg等
        String extension = getFileExtension(thumbnail.getImageName());
        //如果目标路径不存在，自动创建
        makeDirPath(targetAddr);
        //获得文件存储的相对路径(带文件名)
        String relativeAddr = targetAddr + realFileName + extension;
        //获取文件要保存的目标路径
        File dest = new File(FileUtil.getImgBasePath() + relativeAddr);
        try {

            //调用Thumbnails生成带有水印的图片
            Thumbnails.of(thumbnail.getImage()).size(337, 640).outputQuality(0.5f).toFile(dest);
        } catch (IOException e) {
            throw new RuntimeException("创建缩略图失败：" + e.toString());
        }

        //返回图片的相对路径地址
        return relativeAddr;
    }
    /**
     * 创建目标路径上涉及的路径，例如：/home/linchong/xxx.jpg,
     * 则：home，linchong等目录自动创建
     * @param targetAddr
     */
    private static void makeDirPath(String targetAddr) {
        String realFilePrentPath = PathUtil.getImgBasePath()+targetAddr; //目标文件全路径
        File dirPath = new File(realFilePrentPath);
        if(!dirPath.exists()){ //不存在，递归创建路径
             dirPath.mkdirs();
        }
    }

    /**
     * 获得数据文件名的扩展名
     * @param fileName
     * @return
     */
    private static String getFileExtension(String fileName) {

        //String originalFileName = fileName.getName();//.getOriginalFilename();
        return fileName.substring(fileName.lastIndexOf("."));
    }

    /**
     * 生成随机文件名：当前年月日时分秒+五位随机数
     * @return
     */
    public static String getRandomFileName() {

        //1.获得随机的五位数
        int rannum = r.nextInt(89999)+10000;

        String nowTimeStr = sDateFormat.format(new Date());
        return nowTimeStr+rannum;
    }


    public static void main(String[] args) throws IOException {
        /**
         * of函数：传入需要处理的图片文件
         * .size:输出图片的大小，长和宽，都是200像素
         * .workmark:添加的水印，三个参数，
         * arg1:水印位置
         * arg2:水印图片的路径
         * arg3:水印图片透明度
         * outputQuality：压缩图片比例
         * toFile:处理图片后的输出路径
         */
        //String basePath = Thread.currentThread().getContextClassLoader().getResource("").getPath();
        Thumbnails.of(new File("E:\\code\\resources\\back.jpg"))
                .size(200, 200).watermark(Positions.BOTTOM_RIGHT,
                ImageIO.read(new File(basePath + "/linchongs.jpg")), 0.25f).outputQuality(0.8f)
                .toFile("E:\\code\\resources\\back_1.jpg");
    }

    /**
     * 判断storePath是文件路径还是目录的路径
     * 如果是文件路径，则删除该文件
     * 如果storePath是目录路径，删除该目录下的所有文件
     * @param storePath
     */
    public static void deleteFileOrPath(String storePath){
            File fileOrPath = new File(PathUtil.getImgBasePath()+storePath);
            if(fileOrPath.isDirectory()){
                File files[] = fileOrPath.listFiles();
                for(int i = 0;i<files.length;i++){
                    files[i].delete();
                }
            }
            fileOrPath.delete();

    }

}
